Queue এবং Deque ইন্টারফেসগুলি Java Collections Framework এর অংশ, যা ডেটা স্ট্রাকচারগুলি পরিচালনা করতে সাহায্য করে। Queue (প্রধানত FIFO বা First In, First Out) পদ্ধতির ওপর ভিত্তি করে কাজ করে, এবং Deque (ডাবল এন্ডেড কিউ) একটি আরও উন্নত ডেটা স্ট্রাকচার যা উপাদানগুলি উভয় প্রান্ত থেকে ইনসার্ট এবং রিমুভ করতে সক্ষম।
এই নিবন্ধে আমরা Queue এবং Deque ইন্টারফেসের মৌলিক ধারণা এবং PriorityQueue এবং LinkedList এর মাধ্যমে কিভাবে Queue ইন্টারফেসের সাথে ইন্টিগ্রেশন করা যায় তা নিয়ে আলোচনা করব।
1. Queue Interface: মৌলিক ধারণা
Queue ইন্টারফেসটি একটি FIFO ডেটা স্ট্রাকচার, অর্থাৎ প্রথমে প্রবেশ করা উপাদানটি প্রথমে বের করা হবে। এটি সাধারণত line বা queue এর মতো কাজ করে, যেখানে প্রথমে আসা ব্যক্তি (অথবা উপাদান) প্রথমে সেবা পায়।
Queue ইন্টারফেসের মূল বৈশিষ্ট্যগুলি:
- FIFO Order: প্রথমে আসা উপাদানটি প্রথমে বের করা হয়।
- Insertion and Deletion: কেবল এক প্রান্তে উপাদান যোগ করা হয় (enqueue) এবং অন্য প্রান্তে উপাদান সরানো হয় (dequeue)।
Queue Interface এর গুরুত্বপূর্ণ মেথডসমূহ:
- add(E e): কিউতে একটি উপাদান যুক্ত করে। যদি কিউ ফুল থাকে তবে এটি
IllegalStateExceptionতৈরি করবে। - offer(E e): কিউতে একটি উপাদান যুক্ত করার চেষ্টা করে, যদি কিউ পূর্ণ থাকে, তবে এটি false ফেরত দেয়।
- remove(): কিউ থেকে প্রথম উপাদান সরিয়ে দেয়। যদি কিউ খালি থাকে, তবে এটি
NoSuchElementExceptionতৈরি করবে। - poll(): কিউ থেকে প্রথম উপাদান সরিয়ে দেয়, তবে কিউ খালি থাকলে এটি null ফেরত দেয়।
- peek(): কিউয়ের প্রথম উপাদানটিকে পরীক্ষা করে, কিন্তু সরায় না। কিউ খালি থাকলে এটি null ফেরত দেয়।
2. Deque Interface: ডাবল-এন্ডেড কিউ
Deque (Double Ended Queue) একটি ডেটা স্ট্রাকচার যা উপাদানগুলি উভয় প্রান্ত থেকে ইনসার্ট এবং রিমুভ করার অনুমতি দেয়। এটি FIFO বা LIFO (Last In, First Out) উভয় ধরনের অপারেশন সাপোর্ট করতে পারে, যা Queue এর চেয়ে আরও নমনীয়।
Deque এর মূল বৈশিষ্ট্য:
- এটি একটি Queue যা প্রথম এবং শেষ প্রান্ত থেকে উপাদান পরিচালনা করতে সহায়ক।
- এর মধ্যে push() এবং pop() মেথডগুলো stack এর মতো কাজ করে, তবে addFirst(), removeFirst(), addLast(), এবং removeLast() এর মাধ্যমে উভয় প্রান্তে উপাদান অ্যাক্সেস করা যায়।
3. PriorityQueue: Queue এর সাথে Integration
PriorityQueue হল একটি queue যা প্রাধান্য অনুযায়ী উপাদানগুলোকে সাজানোর জন্য ব্যবহৃত হয়। এটি একটি heap-based ডেটা স্ট্রাকচার এবং এর মধ্যে উপাদানগুলি priority অনুসারে সজ্জিত হয়।
PriorityQueue এর মূল বৈশিষ্ট্য:
- এটি natural ordering বা custom comparator দ্বারা উপাদানগুলিকে সাজায়।
- এটি FIFO অনুসরণ করে, তবে উপাদানগুলি priority অনুসারে বের হয়, তাই উচ্চ প্রাধান্য সম্পন্ন উপাদানগুলি আগে বের হবে।
PriorityQueue Example:
import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// Create a PriorityQueue
PriorityQueue<Integer> queue = new PriorityQueue<>();
// Add elements to the queue
queue.add(10);
queue.add(20);
queue.add(15);
// Removing elements according to their priority (ascending order)
System.out.println("PriorityQueue Elements:");
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // Elements are removed in ascending order
}
}
}
Output:
PriorityQueue Elements:
10
15
20
ব্যাখ্যা:
PriorityQueueকিউতেadd()মেথড দ্বারা উপাদান যোগ করা হয়। উপাদানগুলো স্বয়ংক্রিয়ভাবে প্রাধান্য অনুযায়ী সাজানো হয় এবংpoll()মেথডের মাধ্যমে priority অনুসারে উপাদান বের করা হয়।
4. LinkedList: Queue এর সাথে Integration
LinkedList ক্লাসটি Queue ইন্টারফেসের একটি বাস্তবায়ন যা FIFO ভিত্তিক কিউ পরিচালনা করতে ব্যবহৃত হয়। LinkedList একটি double-linked list এবং এতে ইনসার্শন, রিমুভাল ইত্যাদি অপারেশনগুলিতে দ্রুত গতিতে কাজ করা যায়।
LinkedList as Queue Example:
import java.util.LinkedList;
import java.util.Queue;
public class LinkedListQueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Add elements to the queue
queue.add("Java");
queue.add("Python");
queue.add("JavaScript");
// Remove elements from the queue
System.out.println("Queue Elements:");
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // Removes elements from the front
}
}
}
Output:
Queue Elements:
Java
Python
JavaScript
ব্যাখ্যা:
LinkedListএকটি queue হিসেবে ব্যবহৃত হয়েছে, যেখানেadd()মেথড দিয়ে উপাদান যোগ করা হচ্ছে এবংpoll()মেথডের মাধ্যমে FIFO পদ্ধতিতে উপাদানগুলো সরানো হচ্ছে।
Queue এবং Deque এর ব্যবহার ও সুবিধা:
- Queue (PriorityQueue) ব্যবহার:
- Task Scheduling: বিভিন্ন অ্যাপ্লিকেশন যেমন job scheduling বা task scheduling-এ priority queue ব্যবহার করা হয়, যেখানে কাজের প্রাধান্য অনুসারে তা সম্পাদন করা হয়।
- Event Handling: ইভেন্ট সিস্টেমে যেখানে ইভেন্টগুলিকে প্রাধান্য দিয়ে সরানো হয়, সেখানে PriorityQueue ব্যবহৃত হতে পারে।
- Deque ব্যবহার:
- Stack/Queue Implementation: Deque ব্যবহৃত হয় যখন একটি ডেটা স্ট্রাকচার উভয় প্রান্তে ইনসার্ট এবং রিমুভ করতে হয়, যেমন stack বা queue।
- Undo-Redo Operation: Deque-এর সাহায্যে undo/redo অপারেশন তৈরি করা যায়, যেখানে পুরনো এবং নতুন অবস্থা উভয় প্রান্ত থেকে বের করা হয়।
- Queue এবং Deque ইন্টারফেস FIFO বা LIFO ভিত্তিক অপারেশন পরিচালনা করতে ব্যবহৃত হয়।
- PriorityQueue কিউটি priority অনুসারে উপাদান সরানোর জন্য ব্যবহৃত হয়, যা হিপ-ভিত্তিক ডেটা স্ট্রাকচার।
- LinkedList কিউ ব্যবহারে অত্যন্ত কার্যকর, যেহেতু এটি দ্রুত ইনসার্শন এবং রিমুভাল অপারেশন সম্পাদন করতে সক্ষম।
- Queue এবং Deque ইন্টারফেসগুলির মাধ্যমে FIFO, LIFO, এবং priority-based অপারেশনগুলি খুব সহজে এবং দক্ষতার সাথে পরিচালনা করা যায়, যা অনেক ধরনের অ্যাপ্লিকেশনে ব্যবহারযোগ্য।
Read more